﻿/*!
 * Copyright (c), 上海沃恩信息科技有限公司.
 * All rights reserved.
 * Licensed under BSD (https://www.pittypat.work/bsd.html).
 */

using System.Configuration;

namespace Pittypat.Configuration
{
    /// <summary>
    /// Module 配置项目的集合。
    /// </summary>
    public sealed class ModuleConfigCollection : ConfigurationElementCollection
    {
        /// <summary>
        /// 初始化 ModuleConfigurationElementCollection 类的新实例。
        /// </summary>
        public ModuleConfigCollection()
        {
            this.AddElementName = "module";
        }

        /// <summary>
        /// 已重写。获取集合的类型，总是返回 AddRemoveClearMap。
        /// </summary>
        public override ConfigurationElementCollectionType CollectionType
        {
            get
            {
                return ConfigurationElementCollectionType.AddRemoveClearMap;
            }
        }

        /// <summary>
        /// 已重写。创建一个新的 <see cref="ModuleConfig"/> 实例。
        /// </summary>
        /// <returns>返回新创建的 <see cref="ModuleConfig"/> 对象实例。</returns>
        protected override ConfigurationElement CreateNewElement()
        {
            return new ModuleConfig();
        }

        /// <summary>
        /// 已重写。使用配置名称创建 <see cref="ModuleConfig"/> 类的新实例。
        /// </summary>
        /// <param name="elementName">配置名称。</param>
        /// <returns>返回新创建的 <see cref="ModuleConfig"/> 对象实例。</returns>
        protected override ConfigurationElement CreateNewElement(string elementName)
        {
            return new ModuleConfig() { Identifier = elementName };
        }

        /// <summary>
        /// 已重写。获取配置项目的键值。
        /// </summary>
        /// <param name="element">配置项目元素。</param>
        /// <returns>返回配置项目的键值。</returns>
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((ModuleConfig)element).Identifier;
        }

        /// <summary>
        /// 获取指定名称的配置项目。
        /// </summary>
        /// <param name="name">配置项目名称。</param>
        /// <returns>返回相应的配置项目。</returns>
        public new ModuleConfig this[string name]
        {
            get
            {
                foreach (ModuleConfig item in this)
                {
                    if (string.Compare(item.Identifier, name, true) == 0)
                    {
                        return item;
                    }
                }

                return null;
            }
        }

        /// <summary>
        /// 获取指定位置处的配置项目。
        /// </summary>
        /// <param name="index">索引位置。</param>
        /// <returns>返回指定位置处的配置项目。</returns>
        public ModuleConfig this[int index]
        {
            get
            {
                return (ModuleConfig)BaseGet(index);
            }
            set
            {
                if (BaseGet(index) != null)
                {
                    BaseRemoveAt(index);
                }
                BaseAdd(index, value);
            }
        }

        /// <summary>
        /// 获取指定配置项目的索引位置。
        /// </summary>
        /// <param name="element">配置项目。</param>
        /// <returns>返回指定配置项目的索引位置。</returns>
        public int IndexOf(ModuleConfig element)
        {
            return BaseIndexOf(element);
        }

        /// <summary>
        /// 添加一个新的配置项目。
        /// </summary>
        /// <param name="element">要添加的配置项目。</param>
        public void Add(ModuleConfig element)
        {
            BaseAdd(element);
        }

        /// <summary>
        /// 从集合中移除一个配置项目。
        /// </summary>
        /// <param name="element">要移除的配置项目。</param>
        public void Remove(ModuleConfig element)
        {
            var index = BaseIndexOf(element);
            if (index >= 0)
            {
                BaseRemove(index);
            }
        }

        /// <summary>
        /// 从集合中移除指定位置处的配置项目。
        /// </summary>
        /// <param name="index">要移除的配置项目的位置。</param>
        public void RemoveAt(int index)
        {
            BaseRemoveAt(index);
        }

        /// <summary>
        /// 从集合中移除指定名称的配置项目。
        /// </summary>
        /// <param name="name">要移除的配置项目的名称。</param>
        public void Remove(string name)
        {
            BaseRemove(name);
        }

        /// <summary>
        /// 清空集合。
        /// </summary>
        public void Clear()
        {
            BaseClear();
        }
    }
}
